package com.unitd.frame.sso.common.token;

import com.unitd.frame.comm.bean.BaseBean;
import com.unitd.frame.sso.common.config.SSOConfig;
import com.unitd.frame.sso.constant.TokenConstant;

import java.io.Serializable;
import java.util.List;

/**
 * @desc SSO的票据顶级父类, 用于定义浏览器cookie的数据信息, 其他需要自定义的Token需要继承自此类
 * @filename Token.java
 * @copyright www.unitd.com
 * @author Hudan
 * @version 1.0
 * @date 2016/10/14
 */
@SuppressWarnings("serial")
public class Token extends BaseBean {

	/** 系统名称 */
	private String app;
	/** tokenId, 主键ID */
	private Serializable id;
	/** 登陆用户的ID(字符串类型,默认 fastjson 无值该参数不参与 json 序列化) */
	private String uid;
	/** 登陆的用户名 */
	private String uname;
	/** 登录用户是否为超级管理员 */
	private boolean superAdmin;
	/** 授权的配置信息 */
	private List<String> gantProfiles;
	/** 登录用户所在的机构编号 */
	private String orgNo;
	/** 登录用户所在的机构名称 */
	private String orgName;
	/** 登录 IP */
	private String ip;
	/** 创建 token 当前系统时间 */
	private long time = System.currentTimeMillis();
	/** Token 状态标识(默认正常执行) */
	private int flag = TokenConstant.FLAG_NORMAL;

	/**
	 * @desc 通过fastJson将Token转为JSON格式
	 * @return JSON格式Token值
	 */
	public String jsonToken() {
		return SSOConfig.getInstance().getParser().toJson(this);
	}

	/**
	 * @desc 将JSON格式的Token值转为Token对象
	 * @param jsonToken JSON格式Token值
	 * @return Token对象
	 */
	public Token parseToken(String jsonToken) {
		return SSOConfig.getInstance().getParser().parseObject(jsonToken, this.getClass());
	}

	/**
	 * @desc 加密授权Token对象,将AuthToken 转为字符串密文
	 * @return AuthToken 密文信息 {@link AuthToken}
	 */
	public String encryptAuthToken() {
		try {
			SSOConfig sc = SSOConfig.getInstance();
			return sc.getEncrypt().encrypt(jsonToken(), sc.getAuthCookieSecretkey());
		} catch (Exception e) {
			e.printStackTrace();
		}
		return null;
	}

	/**
	 * @desc 生成 Token 缓存主键
	 * @return Token 缓存主键
	 */
	public String toCacheKey() {
		if (this.getId() != null) {
			return SSOConfig.toCacheKey(this.getId());
		}
		return SSOConfig.toCacheKey(this.getUid());
	}

	public String getApp() {
		return app;
	}

	public void setApp(String app) {
		this.app = app;
	}

	public Serializable getId() {
		return id;
	}

	public void setId(Serializable id) {
		this.id = id;
	}

	public String getUid() {
		return uid;
	}

	public void setUid(String uid) {
		this.uid = uid;
	}

	public String getUname() {
		return uname;
	}

	public void setUname(String uname) {
		this.uname = uname;
	}

	public boolean isSuperAdmin() {
		return superAdmin;
	}

	public void setSuperAdmin(boolean superAdmin) {
		this.superAdmin = superAdmin;
	}

	public List<String> getGantProfiles() {
		return gantProfiles;
	}

	public void setGantProfiles(List<String> gantProfiles) {
		this.gantProfiles = gantProfiles;
	}

	public String getOrgNo() {
		return orgNo;
	}

	public void setOrgNo(String orgNo) {
		this.orgNo = orgNo;
	}

	public String getOrgName() {
		return orgName;
	}

	public void setOrgName(String orgName) {
		this.orgName = orgName;
	}

	public String getIp() {
		return ip;
	}

	public void setIp(String ip) {
		this.ip = ip;
	}

	public long getTime() {
		return time;
	}

	public void setTime(long time) {
		this.time = time;
	}

	public int getFlag() {
		return flag;
	}

	public void setFlag(int flag) {
		this.flag = flag;
	}
}